﻿/*! \file */

#ifndef CONFIGURATION_H
#define	CONFIGURATION_H

#include <string>
#include <Log.h>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <boost/property_tree/xml_parser.hpp>


/**
 *	Klasa odpowiedzialna za załadowanie konfiguracji.
 */
class Configuration {
public:
		/**
		 * Konstruktor podstawowy, automatcyznie wyszukuje plików xml.
		 * @param dir folder w którym konfiguracja ma być wyszukiwana.
		 * @param name nazwa pliku, częsciowa lub pełna która ma byc wyszukiwana, rozszerzenie zostanie wtedy automatycznie dodane.
		 */
    	Configuration(const std::string &dir, const std::string &name);

		/**
		 * Metoda typu template odczytuje z konfiguracji wartośc parametru.
		 * @param name nazwa pola jakie ma zostac odczytane z konfiguracji
		 * @param defaultValue domyślna wartość pola gdy nie zostanie ono znalezione.
		 * @return wartość pola którą chcemy odczytać lub wartośc domyślna gdy takiego pola niema.
		 */
		template <typename T>
		T get(const std::string &name, const T &defaultValue)
		{
			try{
				return pt.get<T>(name);
			} catch(const std::exception &e)
			{
				DBUG("Configuration entry for %s not found, using default one.", name.c_str());
				return defaultValue;
			}
		}

		/**
		 * Metoda sprawdza czy konfiguracja została załadowana.
		 * @return true jeśli konfiguracja została załadowana, false jeśli nie
		 */
		inline bool isLoaded() { return readed; }

		/**
		 * Metoda zwraca nazwę znalezionego pliku z konfiguacja.
		 * @return nazwa pliku
		 */
		inline const std::string & getFile() { return m_file; }

		private:
			std::string m_file;
			boost::property_tree::ptree pt;
			bool readed;
};

#endif	/* CONFIGURATION_H */

